# -*- coding: utf-8 -*-
'''
Created on 2009-04-13

@author: argaz
'''
from Dictionnaires import *
import xmlrpclib
import pickle
import sys
import tkMessageBox as msgBox
"""
TODO//
    Optimiser le code pour reduire la communication client-serveur
    Ajouter le code pour la suppression et la modification des champs 
    Tester la vue d'édition dans la vue principale
"""
try:
    from xTkinter import *
except:
    print >> sys.stderr, 'Le module xTkinter est  introuvable'  
    sys.exit(1)

class Messagere(object):
    def __init__(self):
        self.curseur=None
        pass
    
class Vue(Frame):
    def __init__(self,master,parent,**cnf):
        Frame.__init__(self,master,cnf)
        self.parent=parent
        self.configure(width=411,height=272)
        LTable=xLabel(self,text='Tables',height=1,width=6)
        LTable.setLocation(10,10)
        "  Liste des tables existantes "
        self.CBListeTables=xCombobox(self,width=8)
        self.CBListeTables.setLocation(61,10)
        self.CBListeTables.setListWidth(15) 
        self.CBListeTables.setListHeight(3)       
        self.CBListeTables.setText('<aucune>')
        
        LChamps=xLabel(self,text='Champs de la table',height=1,width=18)
        LChamps.setLocation(210,10)
        
        " Pour recharger la liste des tables"
        RechargeTables=xButton(self,text='Recharger',height=1,width=9)
        RechargeTables.setLocation(140,10)

        RechargeTables.setCommand(self.listTables)
        
        " Liste des champs d'une table selectionnée"
        self.CBListeChamps=xCombobox(self,width=7)
        self.CBListeChamps.setLocation(310,10)
        self.CBListeChamps.setWidth(12)
        self.CBListeChamps.setText('<aucun>')
        self.CBListeChamps.setListWidth(15)
        self.CBListeChamps.setListHeight(3)
        
        TitreChamps=xLabel(self,text='Titre du champs',height=1,width=15)
        TitreChamps.setLocation(10,69)
        xLabel3=xLabel(self,text='Type du champs',height=1,width=15)
        xLabel3.setLocation(106,69)
        xLabel4=xLabel(self,text='Taille',height=1,width=6)
        xLabel4.setLocation(196,69)
        xLabel5=xLabel(self,text='Précision',height=1,width=9)
        xLabel5.setLocation(239,69)
        xLabel6=xLabel(self,text='Pattern',height=1,width=7)
        xLabel6.setLocation(300,69)
        self.ETitreChamps=xEntry(self,width=15)
        self.ETitreChamps.setLocation(10,90)
        
        " Type du champs choisi"
        self.CBTypeChamps=xCombobox(self,width=11)
        self.CBTypeChamps.setLocation(107,88)
        self.CBTypeChamps.setText('<aucun>')
        self.CBTypeChamps.setListHeight(5)
        self.CBTypeChamps.setListWidth(15)
        self.CBTypeChamps.addItems(['texte','entier','date','caractère'])
        self.CBTypeChamps.setText('texte')
        
        """
        Spinbutton pour changer la taille du champs 
        Fonction non encore implementée
        """
        self.SBTaille=xSpinbox(self,width=4)
        self.SBTaille.setLocation(197,90)
        self.SBPrecision=xSpinbox(self,width=7)
        self.SBPrecision.setLocation(239,90)
        self.CBPattern=xCombobox(self,width=10)
        self.CBPattern.setLocation(300,87)
        self.CBPattern.setText('<aucun>')
        
        """
        Cette colonne est prévu pour le pattern de la date
             exp jj/mm/aaaa
        """
        self.CBPattern.setActive(False)
        
        """
        Modifier le champs
        """
        self.var=IntVar()
        self.BModifier=xRadiobutton(self,text='Modifier',height=1,width=7)
        self.BModifier.setLocation(68,39)
        self.BModifier.configure(variable=self.var)
        self.BModifier.setValue(2)#self.var)
        self.BModifier.setActive(False)
        """
        Ajouter le champs
        """

        self.BAjouter=xRadiobutton(self,text='Ajouter',height=1,width=5)
        self.BAjouter.setLocation(10,39)
        self.BAjouter.setValue(1)
        self.BAjouter.configure(variable=self.var)
        self.BAjouter.setActive(False)

        """
        Supprimer le champs
        """
        self.BSupprimer=xRadiobutton(self,text='Supprimer',height=1,width=9)
        self.BSupprimer.setLocation(138,39)
        self.BSupprimer.setValue(3)
        self.BSupprimer.configure(variable=self.var)
        self.BSupprimer.setActive(False)
        
        self.place(x=0,y=0)        
        
        
        " Fonction associée à l'evennement <Choix d'une table> "
     
        self.CBListeTables.setValidator(self.obtenirChamps)
  
        " fonction associée à l'evennement <détail du champs>"

        self.CBListeChamps.setValidator(self.obtenirDescriptionChamps)
        pass
     
    def listTables(self):
        curseur=self.parent.obtenirTables()
        if (curseur[0]==1):
            self.CBListeTables.clear()
            self.CBListeTables.setListHeight(3) 
            for table in curseur[1]:
                self.CBListeTables.addItem(table[0])
        else:
            msgBox.showerror('PERP 2009 | Édition des tables', 'Une erreur est survenue!\n'+Reponse[1])
        pass
    
    def obtenirChamps(self):
        reponse=self.parent.obtenirChamps(self.CBListeTables.getText())
        if (reponse[0]==1):
            curseur=reponse[1]
            self.CBListeChamps.clear()
            self.CBListeChamps.setListHeight(3)
            for champs in curseur:        
                self.CBListeChamps.addItem(champs[0])
            self.CBListeChamps.setSelected(0)  
            self.BSupprimer.setActive(True)
            self.BAjouter.setActive(True) 
            self.BModifier.setActive(True)
        else:
            msgBox.showerror('PERP 2009 | Édition des tables', 'Une erreur est survenue!\n'+Reponse[1])
        pass

        pass
    
    def obtenirDescriptionChamps(self):
        reponse=self.parent.obtenirChamps(self.CBListeTables.getText())
        if (reponse[0]==1):
            curseur=reponse[1]
            i=self.CBListeChamps.getIndex()
            self.ETitreChamps.setText(curseur[i][0])
            #self.CBTypeChamps.clear()
            " On récupere le type du champs"
            type=curseur[i][1]
            " puis on cherche sa correspendance dans le dictionnaire "
            type=Dictionnaire.cxType[type]
            self.CBTypeChamps.setText(type)
                
            " Si le type est <texte>"
            "On recupere le 3ème élément de la liste de description"
            if(type=='texte'):
                self.SBTaille.setValue(curseur[i][3])
            else:    
                self.SBTaille.setValue(curseur[i][4])
                " Cette colonne ne conserne que le type NUMBER"
                self.SBPrecision.setValue(curseur[i][5])
                #self.CBPattern.setText()
        else:
            print 'Une erreur est survenue!\n'+reponse[1]
        pass
        pass
    
class Controleur:
    def __init__(self,master):        
        self.vue=Vue(None,self)
        self.serveur = xmlrpclib.ServerProxy('http://localhost:8000')
        self.messagere=Messagere()
        self.connected=self.connecter()
        pass
    
    def connecter(self):
        reponse=self.serveur.connecter('oracle','*','titan')
        if (reponse[0]==1):
            return True
        else:
            print 'Une erreur est survenue!\n'+reponse[1]        
        pass
    
    def obtenirTables(self):
        if(self.connected):              
            reponse=self.serveur.obtenirTables()
            self.messagere=pickle.loads(reponse[1])
            reponse=[reponse[0],self.messagere.curseur]           
            return reponse
        else:
            return [0,'Non connecté']
        pass
    
    def obtenirChamps(self,NomTable):        
        if(self.connected):
            reponse=self.serveur.obtenirChamps(NomTable)
            self.messagere=pickle.loads(reponse[1])
            reponse=[reponse[0],self.messagere.curseur]
            return reponse           
        else:
            return [0,'Non connecté']
        pass
    
if __name__ == '__main__':
        root=Tk()
        controleur=Controleur(root)
        root.configure(width=461,height=272)
        root.mainloop()